SQL쿼리는 MessageSource에서 관리할 것이다. 따라서 MessageSource에서 SQL쿼리를 관리하는 것이 원칙으로 한다.
[예제4-11]DBQuery.properties
board.sql.insert = INSERT INTO BOARD \ (boardno, title, name, email, password, \ createdate, content) \ VALUES(?, ?, ?, ?, ?, ?, ?) board.sql.update = UPDATE BOARD SET \ title=?, name=?, email=?, content=? \ WHERE boardno=? board.sql.update.hitcount = UPDATE BOARD SET \ hitcount = hitcount + 1 \ WHERE boardno=? board.sql.delete = DELETE FROM BOARD WHERE boardno=? board.sql.select.byboardno = SELECT \ title, name, email, password, \ createdate, content, hitcount \ FROM BOARD WHERE boardno=? board.sql.select.list = SELECT \ boardno, title, name, email, createdate, hitcount \ FROM BOARD ORDER BY CREATEDATE DESC LIMIT ?, ? board.sql.totalcount = SELECT count(*) FROM BOARD boardfile.sql.insert = INSERT INTO BOARDFILE VALUES(?, ?, ?, ?, ?, ?) boardfile.sql.delete.byboardno = DELETE FROM BOARDFILE WHERE boardno=? boardfile.sql.delete.byboardfileno = DELETE FROM BOARDFILE WHERE fileno=? boardfile.sql.select.byboardfileno = SELECT \ fileno, filesize, filename, \ contenttype, tempfilename \ FROM BOARDFILE WHERE fileno=? boardfile.sql.select.byboardno = SELECT \ fileno, filesize, filename \ FROM BOARDFILE WHERE boardno=?
[예제4-12]applicationContext.xml
<beans>
... 중간 생략 ...
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basenames"> <list> <value>DBQuery</value> <value>Messages</value> </list> </property> </bean>
<bean id="messageSourceAccessor" class="org.springframework.context.support.MessageSourceAccessor"> <constructor-arg> <ref local="messageSource" /> </constructor-arg> </bean>
<bean id="myJdbcDaoSupport" abstract="true" class="net.javajigi.common.dao.MyJdbcDaoSupport"> <property name="dataSource"> <ref local="dataSource"/> </property> <property name="messageSourceAccessor"> <ref bean="messageSourceAccessor"/> </property> </bean>
<bean id="boardDAOTarget" parent="myJdbcDaoSupport" class="net.javajigi.board.dao.SpringJDBCWithTemplateBoardDAO"> <property name="incrementer"> <ref local="boardIncrementer" /> </property> </bean>
<bean id="boardFileDAOTarget" parent="myJdbcDaoSupport" class="net.javajigi.board.dao.SpringJDBCWithMSBoardFileDAO"> <property name="incrementer"> <ref local="boardFileIncrementer" /> </property> </bean>
</beans>
[예제4-12]의 "myJdbcDaoSupport" 빈을 보면 지금까지 보지 못했던 abstract라는 속성을 사용하고 있는 것을 볼 수 있다. 이는 자바의 abstract 예약어와 비슷한 의미를 가지는 것으로 abstract속성이 true로 설정되어 있으면 빈을 직접 생성하여 사용할 수 없으면, 다른 빈들의 부모(parent)역할을 하는 빈으로 사용된다. 일반적으로 abstract예약어를 많이 사용하는 경우는 "myJdbcDaoSupport"빈과 같이 공통적인 설정 정보가 있는 경우에 유요하게 사용된다.
빈 설정 파일으 ㄹ작성할 때 이와 같이 공통적인 정보들을 반복적으로 정의하는 경우가 많다. 프로그램 개발에서도 중복 코드는 요구사항 변경 시에 모든 소스 코드를 수정해야 하는 것 처럼 설정 파일 또한 같다. 그러므로 빈 설정 파일을 작성할 때 중복적으로 발생하는 설정 정보들이 많다면[예제4-12]와 같이 abstract와 parent를 이용하여 구현하는 것이 바람직하다.
|